/* 
1 获取用户的收货地址(https://developers.weixin.qq.com/community/develop/doc/000c0a0a590490590d0ba0c3d51801)
  1 绑定点击事件
  2 调用小程序内置 api  获取用户的收货地址  wx.chooseAddress

  2 获取 用户 对小程序 所授予 获取地址的  权限 状态 scope
    1 假设 用户 点击获取收货地址的提示框 确定  authSetting scope.address 
      scope 值 true 直接调用 获取收货地址
    2 假设 用户 从来没有调用过 收货地址的api 
      scope undefined 直接调用 获取收货地址
    3 假设 用户 点击获取收货地址的提示框 取消   
      scope 值 false 
      1 诱导用户 自己 打开 授权设置页面(wx.openSetting) 当用户重新给与 获取地址权限的时候 
      2 获取收货地址
    4 把获取到的收货地址 存入到 本地存储中 
2 页面加载完毕
  0 onLoad  onShow 
  1 获取本地存储中的地址数据
  2 把数据 设置给data中的一个变量
3 onShow 
  0 回到了商品详情页面 第一次添加商品的时候 手动添加了属性
    1 num=1;
    2 checked=true;
  1 获取缓存中的购物车数组
  2 把购物车数据 填充到data中
4 全选的实现 数据的展示
  1 onShow 获取缓存中的购物车数组
  2 根据购物车中的商品数据 所有的商品都被选中 checked=true  全选就被选中
5 总价格和总数量
  1 都需要商品被选中 我们才拿它来计算
  2 获取购物车数组
  3 遍历
  4 判断商品是否被选中
  5 总价格 += 商品的单价 * 商品的数量
  5 总数量 +=商品的数量
  6 把计算后的价格和数量 设置回data中即可
6 商品的选中
  1 绑定change事件
  2 获取到被修改的商品对象
  3 商品对象的选中状态 取反
  4 重新填充回data中和缓存中
  5 重新计算全选。总价格 总数量。。。
7 全选和反选
  1 全选复选框绑定事件 change
  2 获取 data中的全选变量 allChecked
  3 直接取反 allChecked=!allChecked
  4 遍历购物车数组 让里面 商品 选中状态跟随  allChecked 改变而改变
  5 把购物车数组 和 allChecked 重新设置回data 把购物车重新设置回 缓存中 
8 商品数量的编辑
  1 "+" "-" 按钮 绑定同一个点击事件 区分的关键 自定义属性 
    1 “+” "+1"
    2 "-" "-1"
  2 传递被点击的商品id goods_id
  3 获取data中的购物车数组 来获取需要被修改的商品对象
  4 当 购物车的数量 =1 同时 用户 点击 "-"
    弹窗提示(showModal) 询问用户 是否要删除
    1 确定 直接执行删除
    2 取消  什么都不做 
  4 直接修改商品对象的数量 num
  5 把cart数组 重新设置回 缓存中 和data中 this.setCart
9 点击结算
  1 判断有没有收货地址信息
  2 判断用户有没有选购商品
  3 经过以上的验证 跳转到 支付页面！ 
 */



Page({

  /**
   * 页面的初始数据
   */
  data: {
    address: {},
    cart: [],
    allChecked: false,
    totalPrice: 0,
    totalNum: 0
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {

  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {
    let address = wx.getStorageSync('address');
    let cart = wx.getStorageSync('cart') || [] //从缓存里面取数据
    this.setData({
      address
    })
    this.setCart(cart)
  },

  // 绑定点击事件
  handleChooseAddress() {
    // 获取收货地址之前
    wx.getSetting({
      success: (result) => {
        console.log(result);
        let authAddress = result.authSetting['scope.address'] //表示授权成功
        if (authAddress == true || authAddress == undefined) {
          wx.chooseAddress({
            success: (result2) => {
              console.log(result2);

              wx.setStorageSync('address', address);

              // cityName: "广州市"
              // countyName: "海珠区"
              // detailInfo: "新港中路397号"
              // errMsg: "chooseAddress:ok"
              // nationalCode: "510000"
              // postalCode: "510000"
              // provinceName: "广东省"

              let address = result2
              let all = result2.provinceName + result2.cityName + result2.countyName + result2.detailInfo
              address.all = all
              // let all=result2.provinceName+result2
              wx.setStorageSync('address', address);

            },

          });

        } else {
          //表示点击的是取消  取消那么需要诱导重新打开授权页面(设置页面)
          wx.openSetting({ //openSetting 打开设置
            success: (result3) => {
              console.log(result3);
              wx.chooseAddress({
                success: (result4) => {
                  console.log(result4);
                },

              });

            },

          });

        }

      },

    });

  },


  // 4 全选的实现 数据的展示
  handleItemAllCheck() {
    let {
      cart,
      allChecked
    } = this.data


    allChecked = !allChecked
    cart.forEach(v => v.checked = allChecked)

    this.setCart(cart)
  },



  //  单选
  handeItemChange(e) {
    let {
      cart
    } = this.data
    console.log(e);
    let {
      id
    } = e.currentTarget.dataset
    let index = cart.findIndex(v => v.goods_id === id)
    cart[index].checked = !cart[index].checked

    this.setCart(cart)

  },


  // 8   商品数量处理 加加与减减处理 
  handleItemNumEdit(e) {
    let {
      cart
    } = this.data
    let {
      id,
      operation
    } = e.currentTarget.dataset
    // console.log(id, operation);
    let index = cart.findIndex(v => v.goods_id === id)
    if (cart[index].num == 1 && operation === -1) { // 商品数量为l 并且还准备点击--的时候 准备删除该商品
      // console.log(operation);

      wx.showModal({
        content: '确定要删除吗',
        success: (result) => {
          if (result.confirm) {
            cart.splice(index, 1)
            this.setCart(cart)
          }
        }

      });

    } else {
      cart[index].num += operation //  如果是1  那就是+1   如果是-1  那就是减-1 
      this.setCart(cart)
    }


  },

  // 结算功能
  handlePay() {
    let {
      address,
      totalNum
    } = this.data
    if (!address.userName) {
      wx.showToast({
        title: '请添加地址'
      });
      return
    }
    if (totalNum==0) {
      wx.showToast({
        title: '请选择商品'
      });
      return
    }

    // 跳转页面
    wx.navigateTo({
      url: '/pages/pay/index',
    });
      
  },


  // 设置购物车状态同时 重新计算 底部工具栏的数据 全选 总价格 购买的数量
  setCart(cart) {
    // 定义全选案钮状态   
    let allChecked = true;
    //定义初始的商品总价格以及数量
    let totalPrice = 0;
    let totalNum = 0;

    cart.forEach(v => {
      if (v.checked) {
        totalPrice += v.goods_price * v.num //求选中的商品总价格
        totalNum += v.num
      } else {
        allChecked = false
      }
    })

    //如果是一个空数组 那么forEach  遍历都是走的是真
    // 需要对空数组进行判断 
    allChecked = cart.length > 0 ? allChecked : false

    this.setData({
      cart,
      allChecked,
      totalPrice,
      totalNum
    })
    wx.setStorageSync('cart', cart) //将数据存入缓存
  },




  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {

  }
})